package serverStuff;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Scanner;

import serverStuff.IServices.ClientType;

public class Client {

	public static ServerReply sendRequest(ClientType type, String isbn,	int updateValue) {
		ServerReply reply = null;

		return reply;
	}

	public static String readISBN(Scanner scanner) {
		String isbn = "";

		System.out.println("Por favor digite o ISBN do livro");
		do {
			isbn = scanner.nextLine().trim();
		} while (isbn.compareTo("") == 0);

		return isbn;
	}

	public static void main(String[] args) {

		try {
			Statistics statistics = new Statistics();
			String isbn = "";
			String statisticName = "";
			ServerReply reply = null;
			int updateValue = 0;

			Registry registry;
			if (args.length == 1) {
				registry = LocateRegistry.getRegistry(args[0]);
				IServices stub = (IServices) registry.lookup("IServices");

				ClientType type = ClientType.None;
				int intType = 0;
				Scanner scanner = new Scanner(System.in);

				do {
					System.out.println("Qual o tipo de cliente que deseja utilizar?");
					System.out.println("1-Usuário Comum");
					System.out.println("2-Livraria");

					intType = scanner.nextInt();

					if (intType == 1) {
						type = ClientType.User;
					} else if (intType == 2) {
						type = ClientType.Library;
					} else {
						System.out.println("Por favor digite um número válido");
					}
				} while (type == ClientType.None);

				int option = 0;

				do {
					System.out.println("Que operação deseja executar?");
					System.out.println("1-Listar todos os títulos e ISBN");
					System.out.println("2-Mostrar descrição do livro");
					System.out.println("3-Mostrar toda informação do livro");
					System.out.println("4-Mostrar toda informação de todos os livros");
					System.out.println("5-Atualizar o número de exemplares no estoque");
					System.out.println("6-Mostrar o número de exemplares no estoque");
					System.out.println("7-Mostrar estatisticas");
					System.out.println("8-Finalizar programa");

					option = scanner.nextInt();

					long nanoTime = 0;
					switch (option) {
					case 1:
						nanoTime = System.nanoTime();
						reply = stub.getAllTitleAndISBN();

						statisticName = "Listar todos os títulos e ISBN";
						break;
					case 2:
						isbn = readISBN(scanner);
						nanoTime = System.nanoTime();
						reply = stub.getDescription(isbn);

						statisticName = "Mostrar descrição do livro";
						break;
					case 3:
						isbn = readISBN(scanner);
						nanoTime = System.nanoTime();
						reply = stub.getBookInfo(isbn);

						statisticName = "Mostrar toda informação do livro";
						break;
					case 4:
						nanoTime = System.nanoTime();
						reply = stub.getAllInformation();

						statisticName = "Mostrar toda informação de todos os livros";
						break;
					case 5:
						isbn = readISBN(scanner);
						System.out.println("Por favor digite o número para o qual deseja atualizar:");
						updateValue = scanner.nextInt();
						nanoTime = System.nanoTime();
						reply = stub.updateBookAmount(isbn, updateValue, type);

						statisticName = "Atualizar o número de exemplares no estoque";
						break;
					case 6:
						nanoTime = System.nanoTime();
						isbn = readISBN(scanner);
						reply = stub.getBookAmount(isbn);

						statisticName = "Mostrar o número de exemplares no estoque";
						break;
					case 7:
						statistics.printAll();
						break;
					case 8:
						break;
					default:
						System.out.println("Por favor, digite uma opção válida!");
						continue;
					}
					if (option < 7) {
						statistics.addValue(statisticName, (System.nanoTime() - nanoTime)/2);
						System.out.println(reply.answer);
					}

				} while (option != 8);

				System.out.println("Finalizando programa");

				scanner.close();
			} else {
				System.out.println("Uso: <server_ip>");
			}

		} catch (RemoteException e) {
			System.out.println("Houve um erro durante a requisição. O programa será fechado.");
		} catch (NotBoundException e) {
			System.out.println("Não foi possível conectar ao servidor. O programa será fechado.");
		}

	}

}
